define(function(require, exports, module) {

	var $ = require('$');
	var Position = require('position');

	var isIE6 = (window.navigator.userAgent || '').toLowerCase().indexOf('msie 6') !== -1;

	// target 是需要添加垫片的目标元素，可以传 `DOM Element` 或 `Selector`
	function Shim(target) {
		// 如果选择器选了多个 DOM，则只取第一个
		this.target = $(target).eq(0);
	}

	// 根据目标元素计算 iframe 的显隐、宽高、定位
	Shim.prototype.sync = function() {
		var target = this.target;
		var iframe = this.iframe;

		// 如果未传 target 则不处理
		if (!target.length)
			return this;

		var height = target.outerHeight();
		var width = target.outerWidth();

		// 如果目标元素隐藏，则 iframe 也隐藏
		// jquery 判断宽高同时为 0 才算隐藏，这里判断宽高其中一个为 0 就隐藏
		// http://api.jquery.com/hidden-selector/
		if (!height || !width || target.is(':hidden')) {
			iframe && iframe.hide();
		} else {
			// 第一次显示时才创建：as lazy as possible
			iframe || (iframe = this.iframe = createIframe(target));

			iframe.css({
				'height' : height,
				'width' : width
			});

			Position.pin(iframe[0], target[0]);
			iframe.show();
		}

		return this;
	};

	// 销毁 iframe 等
	Shim.prototype.destroy = function() {
		if (this.iframe) {
			this.iframe.remove();
			delete this.iframe;
		}
		delete this.target;
	};

	if (isIE6) {
		module.exports = Shim;
	} else {
		// 除了 IE6 都返回空函数
		function Noop() {
		}

		Noop.prototype.sync = function() {
			return this
		};
		Noop.prototype.destroy = Noop;

		module.exports = Noop;
	}

	// Helpers

	// 在 target 之前创建 iframe，这样就没有 z-index 问题
	// iframe 永远在 target 下方
	function createIframe(target) {
		var css = {
			display : 'none',
			border : 'none',
			opacity : 0,
			position : 'absolute'
		};

		// 如果 target 存在 zIndex 则设置
		var zIndex = target.css('zIndex');
		if (zIndex && zIndex > 0) {
			css.zIndex = zIndex - 1;
		}

		return $('<iframe>', {
			src : 'javascript:\'\'', // 不加的话，https 下会弹警告
			frameborder : 0,
			css : css
		}).insertBefore(target);
	}

});